package lp2.projeto.agenda;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.swing.*;

import lp2.projeto.gerenciador.Contato;
import lp2.projeto.gerenciador.Evento;

public class ListaContatos extends JPanel {
	
	private static final long serialVersionUID = 5963146503123578006L;
	protected DefaultListModel listaContatosListModel;
	protected JList listaContatosJList;
	protected JPanel listaContatosJPane;
	protected JTextField listaContatosJTextField;
	protected List<Contato> lista;
	protected JLabel listaContatosJLabel;
	
	public ListaContatos(List<Contato> lista, String descricao){
		super();
		
		listaContatosJPane = this;
		listaContatosJPane.setLayout(new GridBagLayout());
		//listaContatosJPane.setBackground(AgendaGrafica.backgroundColor);
		GridBagConstraints constraints = new GridBagConstraints();
		
		listaContatosJTextField = new JTextField();
		
		listaContatosJTextField.addKeyListener(new KeyListener() {
			
			@Override
			public void keyTyped(KeyEvent arg0) {
				buscaLista();	
			}

			@Override
			public void keyPressed(KeyEvent e) {
				buscaLista();
			}

			@Override
			public void keyReleased(KeyEvent e) {
				buscaLista();
				
			}
		});
	
		
		
		constraints.fill = GridBagConstraints.HORIZONTAL;  
		constraints.anchor = GridBagConstraints.CENTER; 
		constraints.insets = new Insets(5,5,5,5);
		constraints.weighty = 0; 
		constraints.ipady = 0;  
		constraints.weightx = 0.5;
		constraints.gridwidth = 1;   
		constraints.gridy = 0;
		listaContatosJPane.add(listaContatosJTextField, constraints);
		
		// Adicao da lista de contatos
		listaContatosJList = new JList() {
				public String getToolTipText(MouseEvent ev) {
					  int index = locationToIndex(ev.getPoint());
					  if (index > -1) {
						  Contato contato = (Contato)getModel().getElementAt(index);
						  return contato.toStringDetalhado();
					  }
					  return null;
				}
		};
		listaContatosListModel = new DefaultListModel();
		listaContatosJList.setModel(listaContatosListModel);
			
		constraints.fill = GridBagConstraints.BOTH;
		constraints.weighty = 1;       
		constraints.gridwidth = 1;
		constraints.gridheight = 1;
		constraints.gridy = 1;       
		listaContatosJPane.add(new JScrollPane(listaContatosJList),constraints);
		
		constraints.weighty = 0;       
		constraints.fill = GridBagConstraints.HORIZONTAL;
		constraints.gridy = 2;
		listaContatosJLabel = new JLabel("Listando: " + descricao);
		listaContatosJPane.add(listaContatosJLabel, constraints);
		
		setContatos(lista, descricao);
		// TODO: Tratar a exce��o de quando a lista estiver vazia e tentar restringir o nome do Contato
	}
	private void buscaLista() {
		listaContatosListModel.removeAllElements();
		for (Contato contato : lista)
			if (contato.getNome().toLowerCase().startsWith(listaContatosJTextField.getText().toLowerCase()))
				listaContatosListModel.addElement(contato);
	}
	public Contato getContatoSelecionado(){
		if (listaContatosJList.getSelectedIndex() == -1) return null;
		return (Contato) listaContatosListModel.get(listaContatosJList.getSelectedIndex());
	}
	public boolean removeContatoSelecionado() {
		if (getContatoSelecionado() != null) {
			lista.remove(getContatoSelecionado());
			listaContatosListModel.remove(listaContatosJList.getSelectedIndex());
			return true;
		}
		return false;
	}
	public void setContatos(List<Contato> lista, String descricao) {
		Contato[] listaDesordenada = lista.toArray(new Contato[0]);
		Arrays.sort(listaDesordenada);
		this.lista = new ArrayList<Contato>();
		for (int i = 0; i < listaDesordenada.length; i++)
			this.lista.add(listaDesordenada[i]);
		
		listaContatosJLabel.setText("Listando: " + descricao);
		buscaLista();
	}
}
